package sys

import (
	"ginweb-admin/commons/base/service"
	"ginweb-admin/global"
	"ginweb-admin/model/entity/sys"
)

type SysMenuService struct {
	service.BaseService[uint, sys.SysMenu]
}

// 查询列表
func (service *SysMenuService) FindList(keyword string) (sysMenus []*sys.SysMenu, err error) {
	// 获取查询的表结构
	sysMenu := sys.SysMenu{}
	db := global.DB.Model(sysMenu).Unscoped().Order("sort asc")

	// 检索条件
	if len(keyword) > 0 {
		db = db.Where("title like ?", "%"+keyword+"%")
	}

	// 查询
	err = db.Find(&sysMenus).Error
	return sysMenus, err
}

// 递归---tree
func (service *SysMenuService) Tree(allSysMenus []*sys.SysMenu, parentId uint) []*sys.SysMenu {
	// 准备返回Tree的容器
	var nodes []*sys.SysMenu
	// 遍历所有的数据
	for _, sysMenu := range allSysMenus {
		// 遍历根节点
		if sysMenu.ParentId == parentId {
			// 遍历子节点
			childrenMenu := service.Tree(allSysMenus, sysMenu.ID)
			// 判断是否有子节点
			if len(childrenMenu) > 0 {
				// 如果有子节点，就添加到children中
				sysMenu.Children = append(sysMenu.Children, childrenMenu...)
			}
			// 返回所有的菜单数据
			nodes = append(nodes, sysMenu)
		}
	}
	return nodes
}

// 查询父菜单
func (service *SysMenuService) FindMenuRoot() (sysMenus []*sys.SysMenu, err error) {
	// 获取查询的表结构
	sysMenu := sys.SysMenu{}
	err = global.DB.Model(sysMenu).Order("sort asc").Where("parent_id = ?", 0).Find(&sysMenus).Error
	return sysMenus, err
}

// 复制菜单
func (service *SysMenuService) CopyData(id uint) (data *sys.SysMenu, err error) {
	// 根据id查询，获取数据
	sysMenu, err := service.GetById(id)
	if err != nil {
		return nil, err
	}
	// 开始复制，把id重置，路径变空
	sysMenu.ID = 0
	sysMenu.Path = ""
	// 保存到数据库
	dbData, err := service.Create(sysMenu)
	return dbData, err
}
